import 'dart:math';

import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:get/get_navigation/src/routes/transitions_type.dart';

///兼容Get.toName传递参数直接获取widget的情况
class GetNotRoute {
  GetNotRoute._internal();

  factory GetNotRoute() => _instance;
  static final GetNotRoute _instance = GetNotRoute._internal();
  dynamic _arguments;
  Map<String, String>? _parameters;

  /// 获取参数
  S? getArg<S>(String key) {
    var arg = _arguments;
    if (arg == null) {
      return null;
    }

    if (arg is! Map) {
      return null;
    }

    return arg[key];
  }

  /// 获取通过路由路径携带的参数
  String? getParams(String key) {
    return _parameters?[key];
  }

  /// 从[Get.arguments]或[Get.parameters]取参数，优先从[Get.arguments]取值。
  /// 做了类型转换，为了兼容原生传值问题，
  /// 原生如果传值为bool，需要传"0"或"1"或"true"或"false"。
  /// 原生如果传值为复杂对象，需要使用[formJson]进行对象转换。
  T? getArgOrParams<T>(String key, {T? Function(String json)? formJson}) {
    var arg = getArg(key);
    String? params = getParams(key);
    if (arg != null) {
      return arg;
    } else if (params == null) {
      return null;
    } else if (T == bool) {
      return ((params == "1") || (params == "true")) as T;
    } else if (T == String) {
      return params as T;
    } else if (T == int) {
      return int.parse(params) as T;
    } else if (T == double) {
      return double.parse(params) as T;
    } else {
      return (formJson?.call(params) ?? params) as T;
    }
  }

  ///获取page对象并传递参数
  GetPageBuilder toPage(
    Widget page, {
    dynamic arguments,
    Map<String, String>? parameters,
  }) {
    _arguments = arguments;
    _parameters = parameters;
    return () {
      if (page is LifeCycle) {
        (page as LifeCycle).recycle();
      }
      return page;
    };
  }
}

///打开的是同一个界面时，需要你的类继承[Uuid],
///确保你的widget每次都不同，以达到刷新widget的目的。
mixin Uuid {
  final int uuid = Random().nextInt(99999999);
}

///page需要继承[LifeCycle]并实现[recycle]方法，
///手动释放GetX的Controller持有。
abstract class LifeCycle {
  void recycle();
}
